#include "consultamedico.h"
#include <Medicos/reg_mod_medico.h>
#include <QMessageBox>

ConsultaMedico::ConsultaMedico(QWidget *parent) :
    VentanaConsulta(parent)
{
    indiceBusqueda=0;
    this->setWindowTitle("Consultar Medico");
    //Se prepara el modelo general de la tabla
    modeloConsulta->setTable("medico");
    modeloConsulta->setRelation(7, QSqlRelation("especialidad", "id", "descripcion"));
    modeloConsulta->setHeaderData(0,Qt::Horizontal,"Registro");
    modeloConsulta->setHeaderData(1,Qt::Horizontal,"Cedula");
    modeloConsulta->setHeaderData(2,Qt::Horizontal,"Nombre");
    modeloConsulta->setHeaderData(3,Qt::Horizontal,"Apellido");
    modeloConsulta->setHeaderData(4,Qt::Horizontal,"Sexo");
    modeloConsulta->setHeaderData(6,Qt::Horizontal,"Telefono");
    modeloConsulta->setHeaderData(7, Qt::Horizontal, "Especialidad");
    modeloConsulta->setHeaderData(8,Qt::Horizontal,"Correo");
    modeloConsulta->select();

    //Se establece el source model para el filtro
    filtro->setSourceModel(modeloConsulta);

    //Se establece el filtro como modelo de la tabla (proxy)
    ui->tableView->setModel(filtro);
    QStringList elementos;
    elementos << "Nombre" << "Apellido" << "Registro" << "Cedula";
    ui->comboBuscarPor->addItems(elementos);
    ui->tableView->setModel(filtro);
    ui->tableView->hideColumn(5);
    ui->tableView->hideColumn(9);
    ui->textoBusqueda->setPlaceholderText("Nombre");
    //Se filtra el modelo para mostrar solo los medicos activos, se puede filtrar por mas columnas
    filtro->beginDeclareFilter();
    filtro->setFilter(9, QVariant("activo"), Qt::DisplayRole, Qt::MatchExactly);
    filtro->endDeclareFilter();
}


void ConsultaMedico::on_registrar_clicked()
{
    Reg_Mod_Medico *registro = new Reg_Mod_Medico();
    registro->exec();
    modeloConsulta->select();
    delete registro;
}

void ConsultaMedico::on_modificar_clicked()
{
    //Obtener el id de la tabla para el medico seleccionado
    QModelIndexList indexes = obtenerIndicesSeleccionados(0);
    if(indexes.count() == 1){
        QModelIndex index = indexes.at(0).sibling(indexes.at(0).row(), 0);
        int id = ui->tableView->model()->data(index).toInt();


        //Obtener el objeto medico seleccionado
        QDjangoQuerySet<Medico> medicos;
        Medico *med = medicos.filter(QDjangoWhere("num_registro", QDjangoWhere::Equals, id)).at(0);

        //Abrir ventana de modificacion con parametros del medico seleccionado
        Reg_Mod_Medico *modif = new Reg_Mod_Medico(this, med);
        modif->exec();
        modeloConsulta->select();
        med->deleteLater();
        delete modif;
    }
    else{
        cuadroMensaje("Debe seleccionar un medico", "");
    }
}

void ConsultaMedico::on_eliminar_clicked()
{
    //Obtener el id de la tabla para el medico seleccionado
    QModelIndexList indexes = obtenerIndicesSeleccionados(0);
    if(indexes.count() > 0) {
        QModelIndex index = indexes.at(0).sibling(indexes.at(0).row(), 0);

        int id = ui->tableView->model()->data(index).toInt();


        //Obtener el objeto medico seleccionado
        QDjangoQuerySet<Medico> medicos;
        Medico *med = medicos.filter(QDjangoWhere("num_registro", QDjangoWhere::Equals, id)).at(0);
        QMessageBox m;

        int resp = cuadroMensaje("<p align=center><b>Confirmar Cambios</b></p>", "<p align=center>Esta seguro de que desea dar de baja al medico " + med->getNombre() + "?</p>", "advertencia");

        if(resp == QMessageBox::Ok){
            med->setEstado("inactivo");
            med->save();
            delete med;
            modeloConsulta->select();
        }
    }
    else {
       cuadroMensaje("Debe seleccionar un médico", "");
    }
}

void ConsultaMedico::on_textoBusqueda_textChanged(const QString &arg1)
{
    filtro->beginDeclareFilter();
    filtro->setFilter(indiceBusqueda, QVariant(arg1), Qt::DisplayRole, Qt::MatchContains);
    filtro->endDeclareFilter();
}

void ConsultaMedico::on_comboBuscarPor_currentTextChanged(const QString &arg1)
{
    //Como el filtro se fija por indices directos de la tabla se fijan los indices
    //para los casos de busqueda
    //OBS: Tambien sirve para los campos numericos

    if(arg1 == "Nombre") indiceBusqueda = 2;
    else if(arg1 == "Cedula") indiceBusqueda = 1;
    else if(arg1 == "Registro") indiceBusqueda = 0;
    else if(arg1 == "Especialidad") indiceBusqueda = 7;
    ui->textoBusqueda->setPlaceholderText(arg1);
}


void ConsultaMedico::on_refrescarTabla_clicked()
{
    //Al refrescar la tabla se eliminan todos los filtros de todas las columnas
    for(int i=0;i<ui->tableView->model()->columnCount()-1;i++){
        filtro->removeFilter(i);
    }
    ui->comboBuscarPor->setCurrentIndex(0);
}


void ConsultaMedico::on_checkActivos_toggled(bool checked)
{
    //Para fijar la visibilidad de medicos activos o todos
    if(checked){
        filtro->beginDeclareFilter();
        filtro->setFilter(9, QVariant("activo"), Qt::DisplayRole, Qt::MatchExactly);
        filtro->endDeclareFilter();
    }
    else filtro->removeFilter(9);

}

void ConsultaMedico::on_tableView_doubleClicked()
{
   ConsultaMedico::on_modificar_clicked();
}

